const cron = require('node-cron');
const db = require('../config/database');
const dayjs = require('dayjs');
const { authenticateToken, generateString, encryptPhone, decryptPhone } = require('../untils/untils');


class TaskScheduler {
    constructor() {
        this.tasks = new Map();
        this.isRunning = false;
    }

    // 启动定时任务系统
    start() {
        if (this.isRunning) {
            console.log('定时任务系统已在运行中');
            return;
        }

        console.log('🚀 启动定时任务系统...');
        this.isRunning = true;

        // 注册各种定时任务
        this.registerTasks();

        console.log('✅ 定时任务系统启动成功');
    }

    // 停止定时任务系统
    stop() {
        if (!this.isRunning) {
            console.log('定时任务系统未运行');
            return;
        }

        console.log('🛑 停止定时任务系统...');

        // 停止所有任务
        this.tasks.forEach((task, name) => {
            task.stop();
            console.log(`停止任务: ${name}`);
        });

        this.tasks.clear();
        this.isRunning = false;
        console.log('✅ 定时任务系统已停止');
    }

    // 注册所有定时任务
    registerTasks() {
        // // 每天凌晨2点清理过期数据
        // this.registerTask('daily-cleanup', '0 2 * * *', this.dailyCleanup.bind(this));

        // // 每小时检查客户跟进提醒
        // this.registerTask('followup-reminder', '0 * * * *', this.followupReminder.bind(this));

        // // 每周一早上9点生成周报
        // this.registerTask('weekly-report', '0 9 * * 1', this.weeklyReport.bind(this));

        // // 每月1号凌晨1点生成月报
        // this.registerTask('monthly-report', '0 1 1 * *', this.monthlyReport.bind(this));

        // // 每5分钟检查系统状态
        // this.registerTask('system-health-check', '*/5 * * * *', this.systemHealthCheck.bind(this));

        // 每1分钟检查是否需要将客户放入公海
        this.registerTask('is-public-pool', '* * * * *', this.isPublicPool.bind(this));
    }

    // 注册单个定时任务
    registerTask(name, schedule, taskFunction) {
        try {
            const task = cron.schedule(schedule, async () => {
                console.log(`⏰ 执行定时任务: ${name} - ${dayjs().format('YYYY-MM-DD HH:mm:ss')}`);

                try {
                    await taskFunction();
                    console.log(`✅ 任务完成: ${name}`);
                } catch (error) {
                    console.error(`❌ 任务失败: ${name}`, error);
                }
            }, {
                scheduled: false, // 不立即启动
                timezone: "Asia/Shanghai" // 设置时区
            });

            this.tasks.set(name, task);
            task.start(); // 启动任务
            console.log(`📅 注册定时任务: ${name} - ${schedule}`);
        } catch (error) {
            console.error(`❌ 注册任务失败: ${name}`, error);
        }
    }

    // 手动执行任务
    async executeTask(taskName) {
        const task = this.tasks.get(taskName);
        if (!task) {
            throw new Error(`任务不存在: ${taskName}`);
        }

        console.log(`🔧 手动执行任务: ${taskName}`);
        await task._task();
    }

    // 获取所有任务状态
    getTasksStatus() {
        const status = [];
        this.tasks.forEach((task, name) => {
            status.push({
                name,
                running: task.running,
                nextDate: task.nextDate(),
                lastDate: task.lastDate()
            });
        });
        return status;
    }

    // ========== 具体任务实现 ==========

    // // 每日清理任务
    // async dailyCleanup() {
    //     try {
    //         console.log('🧹 开始每日清理任务...');

    //         // 清理30天前的日志
    //         const thirtyDaysAgo = dayjs().subtract(30, 'day').format('YYYY-MM-DD HH:mm:ss');
    //         const [logResult] = await db.execute(
    //             'DELETE FROM phone_verification_log WHERE operation_time < ?',
    //             [thirtyDaysAgo]
    //         );
    //         console.log(`清理了 ${logResult.affectedRows} 条过期日志`);

    //         // 清理临时文件（如果有的话）
    //         // 这里可以添加文件清理逻辑

    //         console.log('✅ 每日清理任务完成');
    //     } catch (error) {
    //         console.error('❌ 每日清理任务失败:', error);
    //         throw error;
    //     }
    // }

    // // 客户跟进提醒
    // async followupReminder() {
    //     try {
    //         console.log('📞 开始客户跟进提醒任务...');

    //         // 查找需要跟进的客户（超过7天未跟进）
    //         const sevenDaysAgo = dayjs().subtract(7, 'day').format('YYYY-MM-DD HH:mm:ss');
    //         const [customers] = await db.execute(
    //             `SELECT cust_id, cust_name, mobile, last_followup 
    //              FROM customer 
    //              WHERE last_followup < ? AND is_public_pool = '否'
    //              ORDER BY last_followup ASC
    //              LIMIT 10`,
    //             [sevenDaysAgo]
    //         );

    //         if (customers.length > 0) {
    //             console.log(`发现 ${customers.length} 个需要跟进的客户:`);
    //             customers.forEach(customer => {
    //                 console.log(`- ${customer.cust_name} (${customer.cust_id}) - 最后跟进: ${customer.last_followup}`);
    //             });

    //             // 这里可以添加发送提醒的逻辑
    //             // 比如发送邮件、短信或推送通知
    //         } else {
    //             console.log('没有需要跟进的客户');
    //         }

    //         console.log('✅ 客户跟进提醒任务完成');
    //     } catch (error) {
    //         console.error('❌ 客户跟进提醒任务失败:', error);
    //         throw error;
    //     }
    // }

    // // 周报生成
    // async weeklyReport() {
    //     try {
    //         console.log('📊 开始生成周报...');

    //         const weekStart = dayjs().startOf('week').format('YYYY-MM-DD');
    //         const weekEnd = dayjs().endOf('week').format('YYYY-MM-DD');

    //         // 统计本周新增客户数
    //         const [newCustomers] = await db.execute(
    //             'SELECT COUNT(*) as count FROM customer WHERE DATE(create_time) BETWEEN ? AND ?',
    //             [weekStart, weekEnd]
    //         );

    //         // 统计本周跟进次数
    //         const [followups] = await db.execute(
    //             'SELECT COUNT(*) as count FROM customer WHERE DATE(last_followup) BETWEEN ? AND ?',
    //             [weekStart, weekEnd]
    //         );

    //         console.log(`📈 周报统计 (${weekStart} - ${weekEnd}):`);
    //         console.log(`- 新增客户: ${newCustomers[0].count} 个`);
    //         console.log(`- 跟进次数: ${followups[0].count} 次`);

    //         // 这里可以添加生成详细报告的逻辑
    //         // 比如生成Excel文件、发送邮件等

    //         console.log('✅ 周报生成完成');
    //     } catch (error) {
    //         console.error('❌ 周报生成失败:', error);
    //         throw error;
    //     }
    // }

    // // 月报生成
    // async monthlyReport() {
    //     try {
    //         console.log('📊 开始生成月报...');

    //         const monthStart = dayjs().startOf('month').format('YYYY-MM-DD');
    //         const monthEnd = dayjs().endOf('month').format('YYYY-MM-DD');

    //         // 统计本月新增客户数
    //         const [newCustomers] = await db.execute(
    //             'SELECT COUNT(*) as count FROM customer WHERE DATE(create_time) BETWEEN ? AND ?',
    //             [monthStart, monthEnd]
    //         );

    //         // 按客户等级统计
    //         const [levelStats] = await db.execute(
    //             `SELECT cust_level, COUNT(*) as count 
    //              FROM customer 
    //              WHERE DATE(create_time) BETWEEN ? AND ?
    //              GROUP BY cust_level`,
    //             [monthStart, monthEnd]
    //         );

    //         console.log(`📈 月报统计 (${monthStart} - ${monthEnd}):`);
    //         console.log(`- 新增客户: ${newCustomers[0].count} 个`);
    //         console.log('- 按等级分布:');
    //         levelStats.forEach(stat => {
    //             console.log(`  ${stat.cust_level}级: ${stat.count} 个`);
    //         });

    //         console.log('✅ 月报生成完成');
    //     } catch (error) {
    //         console.error('❌ 月报生成失败:', error);
    //         throw error;
    //     }
    // }

    // // 系统健康检查
    // async systemHealthCheck() {
    //     try {
    //         console.log('🏥 开始系统健康检查...');

    //         // 检查数据库连接
    //         const [result] = await db.execute('SELECT 1 as health_check');
    //         if (result.length > 0) {
    //             console.log('✅ 数据库连接正常');
    //         }

    //         // 检查任务运行状态
    //         const taskCount = this.tasks.size;
    //         const runningTasks = Array.from(this.tasks.values()).filter(task => task.running).length;

    //         console.log(`📊 任务状态: ${runningTasks}/${taskCount} 个任务正在运行`);

    //         // 这里可以添加更多健康检查项目
    //         // 比如检查磁盘空间、内存使用等

    //         console.log('✅ 系统健康检查完成');
    //     } catch (error) {
    //         console.error('❌ 系统健康检查失败:', error);
    //         throw error;
    //     }
    // }

    // 将客户放入公海
    async isPublicPool() {
        const startTime = Date.now();
        let processedCount = 0;
        let errorCount = 0;
        
        try {
            console.log('📊 开始检查客户是否需要放入公海...');
            
            const currentTime = dayjs();
            const thirtyDaysAgo = currentTime.subtract(30, 'day').format('YYYY-MM-DD HH:mm:ss');
            
            // 查询需要放入公海的客户（30天未跟进）
            const [customersToChurn] = await db.execute(
                `SELECT cust_id, cust_name, mobile, mobile_hash, last_followup 
                 FROM customer 
                 WHERE is_public_pool = '否' 
                 AND last_followup < ?
                 ORDER BY last_followup ASC
                 LIMIT 50`, // 限制每次处理的数量，避免超时
                [thirtyDaysAgo]
            );

            if (customersToChurn.length === 0) {
                console.log('✅ 没有需要放入公海的客户');
                // await this.logChurnProcess(0, 0, 0, Date.now() - startTime);
                return;
            }

            console.log(`发现 ${customersToChurn.length} 个需要放入公海的客户`);

            // 获取当前最大的churn_id（只查询一次）
            const [maxChurnId] = await db.execute('SELECT MAX(churn_id) AS max_churn_id FROM churn_record');
            let nextId = 1;
            if (maxChurnId[0].max_churn_id) {
                const currentNumber = parseInt(maxChurnId[0].max_churn_id.substring(1));
                nextId = currentNumber + 1;
            }

            // 逐个处理客户（避免并发问题）
            for (const customer of customersToChurn) {
                try {
                    // 生成流失记录ID
                    const churnId = generateString('L', nextId + processedCount + errorCount, 5);
                    
                    
                    // 插入流失记录
                    await db.execute(
                        `INSERT INTO churn_record 
                         (churn_id, cust_id, cust_name, mobile, mobile_hash, churn_date,reason) 
                         VALUES (?, ?, ?, ?, ?, ?)`,
                        [
                            churnId,
                            customer.cust_id,
                            customer.cust_name,
                            customer.mobile,
                            customer.mobile_hash,
                            currentTime.format('YYYY-MM-DD HH:mm:ss'),
                            '超30天未联系'
                        ]
                    );

                    // 更新客户状态为公海
                    await db.execute(
                        'UPDATE customer SET is_public_pool = "是" WHERE cust_id = ?',
                        [customer.cust_id]
                    );

                    processedCount++;
                    console.log(`✅ 客户 ${customer.cust_name} (${customer.cust_id}) 已放入公海`);
                    
                } catch (error) {
                    errorCount++;
                    console.error(`❌ 处理客户 ${customer.cust_name} (${customer.cust_id}) 失败:`, error.message);
                }
                
                // 每处理5个客户休息一下，避免数据库压力过大
                if ((processedCount + errorCount) % 5 === 0) {
                    await new Promise(resolve => setTimeout(resolve, 50));
                }
            }

            const duration = Date.now() - startTime;
            console.log(`✅ 公海处理完成: 成功 ${processedCount} 个, 失败 ${errorCount} 个, 耗时 ${duration}ms`);
            
            // 记录处理结果
            // await this.logChurnProcess(processedCount, errorCount, customersToChurn.length, duration);
            
        } catch (error) {
            const duration = Date.now() - startTime;
            console.error('❌ 公海处理任务失败:', error);
            // await this.logChurnProcess(processedCount, errorCount, 0, duration, error.message);
            throw error;
        }
    }

}

// 创建全局实例
const taskScheduler = new TaskScheduler();

module.exports = taskScheduler; 